package com.order.manager.controller.Menu;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.order.manager.Model.MenuInfo;
import com.order.manager.Model.ShopInfo;
import com.order.manager.Model.other.RestBean;
import com.order.manager.service.impl.MenuInfoServiceImpl;
import com.order.manager.service.impl.ShopInfoServiceImpl;
import com.order.manager.util.JwtUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.UUID;

/**
 * 菜单管理控制器
 * 处理菜品信息的增删改查操作，包括权限校验和业务逻辑处理
 */
@RestController
@RequestMapping("/api/menu")
public class MenuController {

    // 注入菜单信息服务，处理菜单相关业务逻辑
    @Resource
    MenuInfoServiceImpl menuInfoService;

    // 注入店铺信息服务，用于验证店铺权限
    @Resource
    ShopInfoServiceImpl shopInfoService;

    // 注入JWT工具类，用于解析用户身份
    @Resource
    JwtUtil jwtUtil;

    /**
     * 添加新菜品
     * @param menuInfo 菜品信息实体，通过JSON请求体传入
     * @param request HTTP请求对象，用于获取用户JWT
     * @return 操作结果：成功返回菜品信息，失败返回错误信息
     */
    @RequestMapping("/insert")
    public RestBean insertMenu(@RequestBody MenuInfo menuInfo, HttpServletRequest request) {
        // 生成唯一的菜品ID
        menuInfo.setMenuId(String.valueOf(UUID.randomUUID()));
        // 设置菜品创建时间为当前时间
        menuInfo.setInputTime(new Date());

        // 校验菜品名称不能为空
        if (menuInfo.getMenuName().isEmpty())
            return RestBean.failure(403, "菜品名称不能为空");

        // 从JWT中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);

        // 校验用户是否拥有店铺
        if (shopInfoService.count(new QueryWrapper<ShopInfo>()
                .eq("shop_master_id", uuid)
        ) == 0) {
            return RestBean.failure(403, "fail auth ,商店有问题");
        }

        try {
            // 获取用户的店铺信息
            ShopInfo shopInfo = shopInfoService.getOne(new QueryWrapper<ShopInfo>()
                    .eq("shop_master_id", uuid)
            );

            // 设置菜品所属店铺ID
            menuInfo.setShopId(shopInfo.getShopId());

            // 保存菜品信息到数据库
            if (menuInfoService.save(menuInfo)) {
                return RestBean.success(menuInfo);
            }
        } catch (Exception e) {
            // 记录异常信息
            System.out.println(e.getMessage());
        }

        return RestBean.failure(500, "服务器故障，请联系管理员");
    }

    /**
     * 删除菜品
     * @param menuId 菜品ID，通过路径变量传入
     * @return 操作结果：成功返回删除成功消息，失败返回错误信息
     */
    @RequestMapping("/del/{menuId}")
    public RestBean delMenu(@PathVariable String menuId) {
        // 根据菜品ID查询菜品信息
        MenuInfo menuInfo = menuInfoService.getById(menuId);

        // 校验菜品是否存在
        if (menuInfo == null) {
            return RestBean.failure(403, "没有该菜品");
        }

        // 从数据库中删除菜品信息
        return menuInfoService.removeById(menuInfo)
                ? RestBean.success("删除成功")
                : RestBean.failure(500, "服务器故障，请联系管理员");
    }

    /**
     * 更新菜品信息
     * @param menuInfo 菜品信息实体，通过JSON请求体传入
     * @param request HTTP请求对象，用于获取用户JWT
     * @return 操作结果：成功返回更新后的菜品信息，失败返回错误信息
     */
    @RequestMapping("/update")
    public RestBean update(@RequestBody MenuInfo menuInfo, HttpServletRequest request) {
        // 从JWT中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);

        // 获取用户的店铺信息
        ShopInfo shopMasterId = shopInfoService.getOne(new QueryWrapper<ShopInfo>()
                .eq("shop_master_id", uuid)
        );

        // 校验用户是否拥有店铺
        if (shopMasterId == null)
            return RestBean.failure(403, "没有店铺信息");

        // 设置菜品所属店铺ID
        menuInfo.setShopId(shopMasterId.getShopId());

        // 查询要更新的菜品信息
        MenuInfo menuInfoServiceOne = menuInfoService.getOne(new QueryWrapper<MenuInfo>()
                .eq("menu_id", menuInfo.getMenuId())
        );

        // 校验菜品是否存在
        if (menuInfoServiceOne == null) {
            return RestBean.failure(403, "没有该菜品");
        } else {
            // 保持原有的店铺ID和创建时间
            menuInfo.setShopId(menuInfoServiceOne.getShopId());
            menuInfo.setInputTime(menuInfoServiceOne.getInputTime());

            // 更新菜品信息到数据库
            if (menuInfoService.updateById(menuInfo)) {
                return RestBean.success(menuInfo);
            }

            return RestBean.failure(500, "服务器故障，请联系管理员");
        }
    }

    /**
     * 查询店铺菜品列表（分页）
     * @param shopId 店铺ID，通过路径变量传入
     * @param page 当前页码，通过路径变量传入
     * @param item 每页显示数量，通过路径变量传入
     * @param menuName 菜品名称（可选），用于模糊查询
     * @return 操作结果：成功返回菜品列表，失败返回错误信息
     */
    @RequestMapping("/select/{shopId}/{page}/{item}")
    public RestBean queryList(@PathVariable String shopId, @PathVariable int page,
                              @PathVariable int item, String menuName) {
        // 调用服务层方法分页查询店铺菜品列表
        return RestBean.success(menuInfoService.queryByShop(shopId, menuName, page, item));
    }

    /**
     * 查询当前用户店铺的菜品列表（分页）
     * @param page 当前页码，通过路径变量传入
     * @param item 每页显示数量，通过路径变量传入
     * @param menuName 菜品名称（可选），用于模糊查询
     * @param request HTTP请求对象，用于获取用户JWT
     * @return 操作结果：成功返回菜品列表，失败返回错误信息
     */
    @RequestMapping("/shopSelect/{page}/{item}")
    public RestBean queryByShopList(@PathVariable int page, @PathVariable int item,
                                    String menuName, HttpServletRequest request) {
        // 从JWT中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 获取用户的店铺信息
        ShopInfo shopMasterId = shopInfoService.getOne(new QueryWrapper<ShopInfo>()
                .eq("shop_master_id", uuid)
        );
        // 校验用户是否拥有店铺
        if (shopMasterId == null) {
            return RestBean.failure(403, "没有开店铺");
        }
        // 调用服务层方法分页查询当前用户店铺的菜品列表
        return RestBean.success(menuInfoService.ShopQueryByShop(shopMasterId.getShopId(), menuName, page, item));
    }

    /**
     * 查询所有菜品（分页）
     * @param page 当前页码，通过路径变量传入
     * @param item 每页显示数量，通过路径变量传入
     * @param menuName 菜品名称（可选），用于模糊查询
     * @return 操作结果：成功返回菜品列表，失败返回错误信息
     */
    @RequestMapping("/get/{page}/{item}")
    public RestBean GetAllMenu(@PathVariable int page, @PathVariable int item, String menuName) {
        // 调用服务层方法分页查询所有菜品
        return RestBean.success(menuInfoService.queryByName(menuName, page, item));
    }
}